package in.rob.client.page;
import in.lib.Constants;
import in.lib.annotation.InjectView;
import in.lib.annotation.OnClick;
import in.lib.manager.CacheManager;
import in.lib.manager.SettingsManager;
import in.lib.manager.UserManager;
import in.lib.utils.CodeUtils;
import in.lib.utils.Views;
import in.rob.client.R;
import in.rob.client.SettingsActivity;
import in.rob.client.base.RobinFragment;
import in.rob.client.dialog.base.DialogBuilder;
import java.util.ArrayList;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.text.Editable;
import android.text.Html;
import android.text.InputFilter;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;
import com.google.analytics.tracking.android.GAServiceManager;
import com.google.analytics.tracking.android.GoogleAnalytics;
import com.google.analytics.tracking.android.Tracker;
public class AppearanceSettingsPage extends RobinFragment implements OnCheckedChangeListener, OnSeekBarChangeListener, OnClickListener
{
@InjectView(R.id.timeline_cover) public CheckBox mTimelineCover;
@InjectView(R.id.timeline_break) public CheckBox mTimelineBreak;
@InjectView(R.id.unified_stream) public CheckBox mUnifiedStream;
@InjectView(R.id.post_times) public CheckBox mLongDates;
@InjectView(R.id.avatar_images) public CheckBox mShowAvatars;
@InjectView(R.id.a_directed_msgs) public CheckBox mToggleDirectedMsgs;
@InjectView(R.id.mention_directed_msgs) public CheckBox mToggleDirectedMentions;
@InjectView(R.id.inline_images) public CheckBox mToggleInlineImages;
@InjectView(R.id.global_page) public CheckBox mGlobalStream;
@InjectView(R.id.font_size) public SeekBar mFontSize;
@InjectView(R.id.font_size_text) public TextView mFontSizeTv;
@InjectView(R.id.name_order) public TextView mNameOrder;
@InjectView(R.id.invert_post_checkbox) public CheckBox mInvertPost;
@InjectView(R.id.lightbox_checkbox) public CheckBox mLigtbox;
@InjectView(R.id.image_viewer_checkbox) public CheckBox mImagebox;
@InjectView(R.id.custom_fonts) public CheckBox mCustomFonts;
@InjectView(R.id.web_readability) public CheckBox mWebReadability;
@OnClick @InjectView(R.id.name_order_container) public View mNameOrderContainer;
@OnClick @InjectView(R.id.theme_container) public View mThemeContainer;
@OnClick @InjectView(R.id.locale_container) public View mLocaleContainer;
@OnClick @InjectView(R.id.animation_options) public View mAnimations;
@OnClick @InjectView(R.id.emphasis_options) public View mEmphasis;
@OnClick @InjectView(R.id.single_click_link) public View mSingleClickLink;
private ArrayList<String> mNameOrderHistory;
private SettingsManager mSettingsManager;
private Intent mIntent = new Intent();
private String[] mFontSizeOpts;
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.appearance_settings_view, null);
Views.inject(this, view);
return view;
}
@Override public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
mSettingsManager = SettingsManager.getInstance();
mFontSizeOpts = new String[]
{
getString(R.string.small),
getString(R.string.normal),
getString(R.string.medium),
getString(R.string.large),
getString(R.string.larger),
getString(R.string.larger_still),
getString(R.string.am_blind)
};
// init inputs
mFontSizeTv.setText(mFontSizeOpts[SettingsManager.getFontSizeIndex()]);
mFontSize.setProgress((SettingsManager.getFontSizeIndex() * 10) + 9);
mFontSize.setOnSeekBarChangeListener(this);
mUnifiedStream.setChecked(SettingsManager.isUsingUnified());
mUnifiedStream.setOnCheckedChangeListener(this);
mTimelineBreak.setChecked(SettingsManager.isTimelineBreakEnabled());
mTimelineBreak.setOnCheckedChangeListener(this);
mTimelineCover.setChecked(SettingsManager.getShowTimelineCover());
mTimelineCover.setOnCheckedChangeListener(this);
mToggleDirectedMsgs.setChecked(SettingsManager.getShowDirectedPosts());
mToggleDirectedMsgs.setOnCheckedChangeListener(this);
mToggleInlineImages.setChecked(SettingsManager.isInlineImagesEnabled());
mToggleInlineImages.setOnCheckedChangeListener(this);
mShowAvatars.setChecked(SettingsManager.getShowAvatars());
mShowAvatars.setOnCheckedChangeListener(this);
mLongDates.setChecked(SettingsManager.getShowLongDates());
mLongDates.setOnCheckedChangeListener(this);
mGlobalStream.setChecked(SettingsManager.isGlobalEnabled());
mGlobalStream.setOnCheckedChangeListener(this);
mNameOrder.setText(SettingsManager.getNameDisplayOrder());
mInvertPost.setChecked(SettingsManager.isInvertPostClick());
mInvertPost.setOnCheckedChangeListener(this);
mLigtbox.setChecked(SettingsManager.isLightboxEnabled());
mLigtbox.setOnCheckedChangeListener(this);
mImagebox.setChecked(SettingsManager.isImageViewerEnabled());
mImagebox.setOnCheckedChangeListener(this);
mToggleDirectedMentions.setChecked(SettingsManager.getShowDirectedMentions());
mToggleDirectedMentions.setOnCheckedChangeListener(this);
mCustomFonts.setChecked(SettingsManager.isCustomFontsEnabled());
mCustomFonts.setOnCheckedChangeListener(this);
mWebReadability.setChecked(SettingsManager.isWebReadabilityEnabled());
mWebReadability.setOnCheckedChangeListener(this);
}
@Override public void onStart()
{
super.onStart();
mNameOrderHistory = CacheManager.getInstance().readFileAsObject(Constants.CACHE_NAME_HISTORY, new ArrayList<String>());
}
@Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if (buttonView == mTimelineBreak)
{
mSettingsManager.setTimelineBreakEnabled(isChecked);
}
else if (buttonView == mWebReadability)
{
mSettingsManager.setWebReadabilityEnabled(isChecked);
}
else if (buttonView == mCustomFonts)
{
mSettingsManager.setCustomFontsEnabled(isChecked);
showRestartToast();
}
else if (buttonView == mToggleDirectedMentions)
{
mSettingsManager.setShowDirectedMentions(isChecked);
}
else if (buttonView == mLigtbox)
{
mSettingsManager.setLightboxEnabled(isChecked);
}
else if (buttonView == mImagebox)
{
mSettingsManager.setImageViewerEnabled(isChecked);
}
else if (buttonView == mInvertPost)
{
mSettingsManager.setInvertPostEnabled(isChecked);
}
else if (buttonView == mTimelineCover)
{
mSettingsManager.setTimelineCoverEnabled(isChecked);
mIntent.putExtra(Constants.EXTRA_REFRESH_TIMELINE_COVER, true);
showRestartToast();
}
else if (buttonView == mUnifiedStream)
{
mSettingsManager.setUsingUnified(isChecked);
mIntent.putExtra(Constants.EXTRA_REFRESH_TIMELINE, true);
}
else if (buttonView == mGlobalStream)
{
mSettingsManager.setGlobalEnabled(isChecked);
mIntent.putExtra(Constants.EXTRA_REFRESH_GLOBAL, true);
}
else if (buttonView == mLongDates)
{
mSettingsManager.setShowLongDates(isChecked);
mIntent.putExtra(Constants.EXTRA_REFRESH_TIMES, true);
}
else if (buttonView == mToggleInlineImages)
{
mSettingsManager.setInlineImagesEnabled(isChecked);
mIntent.putExtra(Constants.EXTRA_REFRESH_INLINE, true);
}
else if (buttonView == mToggleDirectedMsgs)
{
mSettingsManager.setShowDirectedPosts(isChecked);
mIntent.putExtra(Constants.EXTRA_REFRESH_TIMELINE, true);
}
else if (buttonView == mShowAvatars)
{
mSettingsManager.setShowAvatars(isChecked);
mIntent.putExtra(Constants.EXTRA_REFRESH_LIST, true);
}
if (mIntent.getExtras() != null && !mIntent.getExtras().isEmpty())
{
getActivity().setResult(Constants.RESULT_REFRESH, mIntent);
}
}
public void showRestartToast()
{
Toast.makeText(getContext(), R.string.setting_restart_message, Toast.LENGTH_SHORT).show();
if (getActivity() instanceof SettingsActivity)
{
((SettingsActivity)getActivity()).setRestartRequired(true);
}
}
@Override public void onClick(View v)
{
if (v == mAnimations)
{
showAnimationOptions();
}
else if (v == mEmphasis)
{
showEmphasisOptions();
}
else if (v == mSingleClickLink)
{
showSingleClickOptions();
}
else if (v == mLocaleContainer)
{
showLocaleOptions();
}
else if (v == mNameOrderContainer)
{
((SettingsActivity)getActivity()).lockOrientation();
final ArrayList<CharSequence> items = new ArrayList<CharSequence>();
CharSequence[] arr = getResources().getStringArray(R.array.name_orders_values);
for (CharSequence s : arr)
{
String[] parts = CodeUtils.nameOrderParse(s.toString(), UserManager.getUser());
items.add(Html.fromHtml("<b>" + parts[0] + "</b> " + parts[1]));
}
items.addAll(mNameOrderHistory);
items.add(getString(R.string.custom));
DialogBuilder.create(getContext())
.setTitle(R.string.pick_option)
.setItems(items.toArray(new CharSequence[items.size()]), new DialogInterface.OnClickListener()
{
@Override public void onClick(DialogInterface dialog, int which)
{
Tracker t = GoogleAnalytics.getInstance(getContext()).getTracker(getString(R.string.ga_trackingId));
String[] vals = getResources().getStringArray(R.array.name_orders_values);
if (which > vals.length - 1 && which != items.size() - 1)
{
mSettingsManager.setNameDisplayOrder(items.get(which).toString());
mNameOrder.setText(items.get(which));
getActivity().setResult(Constants.RESULT_REFRESH, mIntent.putExtra(Constants.EXTRA_REFRESH_NAMES, true));
t.trackEvent("settings", "custom name", mNameOrder.getText().toString(), System.currentTimeMillis());
}
else if (which == items.size() - 1)
{
showCustomOrders();
}
else
{
mSettingsManager.setNameDisplayOrder(vals[which]);
mNameOrder.setText(vals[which]);
getActivity().setResult(Constants.RESULT_REFRESH, mIntent.putExtra(Constants.EXTRA_REFRESH_NAMES, true));
t.trackEvent("settings", "custom name", mNameOrder.getText().toString(), System.currentTimeMillis());
}
if (SettingsManager.isAnalyticsEnabled())
{
GAServiceManager.getInstance().dispatch();
}
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
dialog.dismiss();
}
})
.show();
}
else if (v == mThemeContainer)
{
((SettingsActivity)getActivity()).lockOrientation();
CharSequence[] options = {"Light", "Dark"};
final String[] res = {getResources().getResourceEntryName(R.style.DefaultLight), getResources().getResourceEntryName(R.style.DefaultDark)};
DialogBuilder.create(getContext())
.setTitle(R.string.pick_option)
.setItems(options, new DialogInterface.OnClickListener()
{
@Override public void onClick(DialogInterface dialog, int which)
{
mSettingsManager.setAppTheme(res[which]);
dialog.dismiss();
showRestartToast();
}
})
.show();
}
}
/**
* Popup for animation settings
*/
public void showAnimationOptions()
{
final boolean[] options = new boolean[getResources().getStringArray(R.array.animation_options).length];
final int[] ints = getResources().getIntArray(R.array.animation_setting_choice_mask);
for (int index = 0; index < ints.length; index++)
{
options[index] = (SettingsManager.getAnimations() & ints[index]) == ints[index];
}
DialogBuilder.create(getContext())
.setTitle(R.string.select_animation_option)
.setMultiChoiceItems(R.array.animation_options, options, new DialogInterface.OnMultiChoiceClickListener()
{
@Override public void onClick(DialogInterface dialog, int which, boolean isChecked)
{
options[which] = isChecked;
}
})
.setPositiveButton(R.string.done, new DialogInterface.OnClickListener()
{
@Override public void onClick(DialogInterface dialog, int which)
{
int finalInt = 0;
for (int index = 0; index < options.length; index++)
{
if (options[index])
{
finalInt |= ints[index];
}
}
mSettingsManager.setAnimationOptions(finalInt);
mIntent.putExtra(Constants.EXTRA_REFRESH_ANIMATIONS, true);
getActivity().setResult(Constants.RESULT_REFRESH, mIntent);
}
})
.setNegativeButton(R.string.cancel, null)
.show();
}
/**
* Popup for emphasis settings
*/
public void showEmphasisOptions()
{
final boolean[] options = new boolean[getResources().getStringArray(R.array.emphasis_options).length];
final int[] ints = getResources().getIntArray(R.array.emphasis_setting_choice_mask);
for (int index = 0; index < ints.length; index++)
{
options[index] = (SettingsManager.getPostEmphasis() & ints[index]) == ints[index];
}
DialogBuilder.create(getContext())
.setTitle(R.string.select_emphasis_option)
.setMultiChoiceItems(R.array.emphasis_options, options, new DialogInterface.OnMultiChoiceClickListener()
{
@Override public void onClick(DialogInterface dialog, int which, boolean isChecked)
{
options[which] = isChecked;
}
})
.setPositiveButton(R.string.done, new DialogInterface.OnClickListener()
{
@Override public void onClick(DialogInterface dialog, int which)
{
int finalInt = 0;
for (int index = 0; index < options.length; index++)
{
if (options[index])
{
finalInt |= ints[index];
}
}
mSettingsManager.setPostEmphasisOptions(finalInt);
mIntent.putExtra(Constants.EXTRA_REFRESH_ALL_DATA, true);
getActivity().setResult(Constants.RESULT_REFRESH, mIntent);
}
})
.setNegativeButton(R.string.cancel, null)
.show();
}
/**
* Popup for single click settings
*/
public void showSingleClickOptions()
{
final boolean[] options = new boolean[getResources().getStringArray(R.array.single_click_options).length];
final int[] ints = getResources().getIntArray(R.array.single_click_setting_choice_mask);
for (int index = 0; index < ints.length; index++)
{
options[index] = (SettingsManager.getSingleClickLinks() & ints[index]) == ints[index];
}
DialogBuilder.create(getContext())
.setTitle(R.string.please_select)
.setMultiChoiceItems(R.array.single_click_options, options, new DialogInterface.OnMultiChoiceClickListener()
{
@Override public void onClick(DialogInterface dialog, int which, boolean isChecked)
{
options[which] = isChecked;
}
})
.setPositiveButton(R.string.done, new DialogInterface.OnClickListener()
{
@Override public void onClick(DialogInterface dialog, int which)
{
int finalInt = 0;
for (int index = 0; index < options.length; index++)
{
if (options[index])
{
finalInt |= ints[index];
}
}
mSettingsManager.setSingleClickOptions(finalInt);
mIntent.putExtra(Constants.EXTRA_REFRESH_LIST, true);
getActivity().setResult(Constants.RESULT_REFRESH, mIntent);
}
})
.setNegativeButton(R.string.cancel, null)
.show();
}
/**
* Popup for animation settings
*/
public void showLocaleOptions()
{
final String[] options = getResources().getStringArray(R.array.locale_options);
final String[] locales = getResources().getStringArray(R.array.locales);
DialogBuilder.create(getContext())
.setTitle(R.string.please_select)
.setItems(options, new DialogInterface.OnClickListener()
{
@Override public void onClick(DialogInterface dialog, int which)
{
mSettingsManager.setLocale(locales[which]);
showRestartToast();
}
})
.setNegativeButton(R.string.cancel, null)
.show();
}
/**
* Used to show the popup to create custom name orders
*/
public void showCustomOrders()
{
String instr = "Note: To seperate the names, use the | (pipe) character" +
"<br /><br />Variables:" +
"<br /><b>{#username}</b> = " + UserManager.getUser().getMentionName() +
"<br /><b>{#firstname}</b> = " + UserManager.getUser().getFirstName() +
"<br /><b>{#lastname}</b> = " + UserManager.getUser().getLastName() +
"<br /><b>{#fullname}</b> = " + UserManager.getUser().getUserName() +
"<br /><br />Functions:" +
"<br />Note: you can comma-seperate parameters, a blank paramter counts as a space" +
"<br /><b>uc()</b>: Upper Case" +
"<br /><b>lc()</b>: lower case" +
"<br /><b>cap()</b>: CAPITIALIZE" +
"<br /><br />Operators:" +
"<br /><b>[0-100]</b>: Character at index (starts at 0) E.G {#username}[0,1,2,3,4,5,6] = \"" + UserManager.getUser().getMentionName().substring(0, Math.min(6, UserManager.getUser().getMentionName().length())) + "\"";
View view = LayoutInflater.from(getContext()).inflate(R.layout.custom_name_view, null, false);
TextView instructions = (TextView)view.findViewById(R.id.instructions);
final TextView preview = (TextView)view.findViewById(R.id.preview);
final EditText input = (EditText)view.findViewById(R.id.input);
instructions.setText(Html.fromHtml(instr));
InputFilter[] FilterArray = new InputFilter[1];
FilterArray[0] = new InputFilter.LengthFilter(60);
input.setFilters(FilterArray);
input.addTextChangedListener(new TextWatcher()
{
@Override public void onTextChanged(CharSequence s, int start, int before, int count)
{
String[] format = CodeUtils.nameOrderParse(s.toString(), UserManager.getUser());
if (format.length > 0)
{
format[0] = "<b>" + format[0] + "</b> ";
String string = "";
for (String str : format)
{
string += str.replaceAll("[\\s]", " ");
}
preview.setText(Html.fromHtml(string));
}
}
@Override public void beforeTextChanged(CharSequence s, int start, int count, int after){}
@Override public void afterTextChanged(Editable s){}
});
input.setText(SettingsManager.getNameDisplayOrder());
((SettingsActivity)getActivity()).lockOrientation();
DialogBuilder.create(getContext())
.setTitle(R.string.create_custom_order)
.setView(view)
.setPositiveButton(R.string.done, new DialogInterface.OnClickListener()
{
@Override public void onClick(DialogInterface dialog, int which)
{
mSettingsManager.setNameDisplayOrder(input.getText().toString());
if (!mNameOrderHistory.contains(input.getText().toString()))
{
mNameOrderHistory.add(input.getText().toString());
}
mNameOrder.setText(input.getText().toString());
CacheManager.getInstance().writeFile(Constants.CACHE_NAME_HISTORY, mNameOrderHistory);
if (SettingsManager.isAnalyticsEnabled())
{
Tracker t = GoogleAnalytics.getInstance(getContext()).getTracker(getString(R.string.ga_trackingId));
t.trackEvent("settings", "custom name", mNameOrder.getText().toString(), System.currentTimeMillis() / 10000L);
GAServiceManager.getInstance().dispatch();
}
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
mIntent.putExtra(Constants.EXTRA_REFRESH_NAMES, true);
getActivity().setResult(Constants.RESULT_REFRESH, mIntent);
}
})
.setNegativeButton(R.string.cancel, null)
.show();
}
@Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
if (seekBar == mFontSize)
{
mSettingsManager.setFontSize(progress / 10);
mFontSizeTv.setText(mFontSizeOpts[progress / 10]);
mIntent.putExtra(Constants.EXTRA_REFRESH_FONTS, true);
getActivity().setResult(Constants.RESULT_REFRESH, mIntent);
}
}
@Override public void onStartTrackingTouch(SeekBar seekBar){}
@Override public void onStopTrackingTouch(SeekBar seekBar){}
}